#include "LobbyLogic.h"

#include "LobbyMisc.h"

#include "WONGUI/MenuBar.h"

using namespace WONAPI;


///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
LobbyLogic::LobbyLogic()
{
	mKilled = false;
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
LobbyLogic::~LobbyLogic()
{
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void LobbyLogic::Kill()
{
	mKilled = true;
	mOpTracker.KillAll();
	KillHook();
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void LobbyLogic::KillHook() 
{ 
}
	
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void LobbyLogic::RunOpTrack(AsyncOp *theOp, LogicCompletionBase *theCompletion, DWORD theTime)
{
	theOp->SetCompletion(theCompletion);
	if(theCompletion!=NULL)
		theCompletion->SetTrack(true);

	mOpTracker.Track(theOp);
	LobbyMisc::RunOp(theOp,theTime);
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void LobbyLogic::RunOp(AsyncOp *theOp, LogicCompletionBase *theCompletion, DWORD theTime)
{
	theOp->SetCompletion(theCompletion);
	LobbyMisc::RunOp(theOp,theTime);
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
bool LobbyLogic::UntrackOp(AsyncOp *theOp)
{
	return mOpTracker.Untrack(theOp);
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void LobbyLogic::Init(ComponentConfig *theConfig)
{
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void LobbyLogic::HandleControlEvent(int theControlId)
{
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void LobbyLogic::HandleComponentEvent(ComponentEvent *theEvent)
{
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void LobbyLogic::TimerEvent()
{
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
LobbyLogicMgr::LobbyLogicMgr()
{
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void LobbyLogicMgr::AddLogic(LobbyLogic *theLogic)
{
	mLogicList.push_back(theLogic);
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void LobbyLogicMgr::Init(ComponentConfig *theConfig)
{
	for(LogicList::iterator anItr = mLogicList.begin(); anItr!=mLogicList.end(); ++anItr)
		(*anItr)->Init(theConfig);	
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void LobbyLogicMgr::Kill()
{
	for(LogicList::iterator anItr = mLogicList.begin(); anItr!=mLogicList.end(); ++anItr)
		(*anItr)->Kill();
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void LobbyLogicMgr::DispatchControlEvent(int theControlId)
{
	for(LogicList::iterator anItr = mLogicList.begin(); anItr!=mLogicList.end(); ++anItr)
		(*anItr)->HandleControlEvent(theControlId);
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void LobbyLogicMgr::DispatchComponentEvent(ComponentEvent *theEvent)
{
	for(LogicList::iterator anItr = mLogicList.begin(); anItr!=mLogicList.end(); ++anItr)
		(*anItr)->HandleComponentEvent(theEvent);
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void LobbyLogicMgr::DispatchTimerEvent()
{
	for(LogicList::iterator anItr = mLogicList.begin(); anItr!=mLogicList.end(); ++anItr)
		(*anItr)->TimerEvent();
}


///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void LobbyLogicMgr::HandleComponentEvent(ComponentEvent *theEvent)
{
	switch(theEvent->mType)
	{
		case ComponentEvent_ListItemUpClicked:
		{
			ListItemClickedEvent* theMenuEvent = (ListItemClickedEvent*)theEvent;
			if (theMenuEvent->mItem == NULL || theMenuEvent->mButton != MouseButton_Left)
				return;

			MenuItem* aMenuItem = dynamic_cast<MenuItem*>(theMenuEvent->mItem.get());
			if (aMenuItem == NULL)
				break;

			DispatchControlEvent(aMenuItem->mMenuId);
			break;
		}			

		case ComponentEvent_ButtonPressed:
			DispatchControlEvent(theEvent->GetControlId());
			break;

		default:
			DispatchComponentEvent(theEvent);
	}
}
